home *** CD-ROM | disk | FTP | other *** search
/ Almathera Ten Pack 2: CDPD 1 / Almathera Ten on Ten - Disc 2: CDPD 1.iso / pd / 576-600 / 579 / cass / cass_pal.p < prev    next >
Text File  |  1995-03-15  |  24KB  |  692 lines

  1. program CassetteCoverPrinter_PAL;
  2.  
  3. { This program prints out cassette labels either as ASCII-Files or as source
  4.   for use with LaTeX.
  5.   PAL Version 1.1
  6.   ©1991 by Jörn Clausen                                                      }
  7.  
  8.  
  9. { Get the right stuff. }
  10. uses Intuition,Graphics;
  11. from Windows uses ArpFilerequester;
  12.  
  13.  
  14. { A few useful things. }
  15. const spaces="                                ";
  16.       line="+-------------------------------------------------------------------+";
  17.       fileIDstandard="CASSDATA"
  18.  
  19.  
  20. { This one needed for all the borders. }
  21. type IntArr10=array [1..10] of integer;
  22.  
  23.  
  24. { Loads of definitions. }
  25. var MyScreen                                  : ^Screen;
  26.     MyWindow                                  : ^Window;
  27.     Msg                                       : ^IntuiMessage;
  28.     Running,success                           : boolean;
  29.     ProjMen,PrinMen                           : Menu;
  30.     Clear,Load,Save,About,Quit,ASCII,LaTeX,
  31.     ToFile,ToPrinter                          : MenuItem;
  32.     SongGad                                   : array [1..30] of Gadget;
  33.     SongTexInfo                               : array [1..30] of StringInfo;
  34.     SongTex,UndoSongTex,OtherSideTex          : array [1..30] of String[32];
  35.     TitleGad                                  : array [1..4] of Gadget;
  36.     TitleTexInfo                              : array [1..4] of StringInfo;
  37.     TitleTex,UndoTitleTex                     : array [1..4] of String[32];
  38.     NRGad,SourceGad,DateGad                   : array [1..2] of Gadget;
  39.     DateTexInfo                               : array [1..2] of StringInfo;
  40.     DateTex,UndoDateTex                       : array [1..2] of String[11];
  41.     LengthGad,PosGad,SwitchGad                : Gadget;
  42.     TextBord,NRBord,SourceBord,DateBord,
  43.     LengthBord,PosBord,SwitchBord             : Border;
  44.     TextBordXY,NRBordXY,SourceBordXY,
  45.     DateBordXY,LengthBordXY,PosBordXY,
  46.     SwitchBordXY                              : IntArr10;
  47.     NRGadText,SourceGadText,DateIText,
  48.     LengthGadText,PosGadText,SwitchGadText,
  49.     ClearIText,LoadIText,SaveIText,AboutIText,
  50.     QuitIText,ASCIIIText,LaTeXIText,
  51.     ToFileIText,ToPrinterIText                : IntuiText;
  52.     Side,Length,Pos                           : integer;
  53.     NR,Source                                 : array [1..2] of integer;
  54.     NRText                                    : array [1..5] of String[9];
  55.     LengthText                                : array [1..5] of String[4];
  56.     PosText                                   : array [1..3] of String[7];
  57.     SourceText                                : array [1..9] of String[9];
  58.     Picked,PMenu,PMenuItem,PMenuSubItem       : integer;
  59.     ClickGad                                  : ^Gadget;
  60.     Output                                    : text;
  61.  
  62.  
  63. { This looks rather ugly, but how can I convert integers to strings without
  64.   causing too much problems? }
  65. procedure PrintNumbers;
  66.   var start,i,j : integer;
  67.       NumIText  : IntuiText;
  68.       Number    : String;
  69.  begin
  70.   for j:=1 to 15 do
  71.    begin
  72.     start:=Side*15;
  73.     i:=j+start;
  74.     if i<10 then
  75.      Number:=Concat(' ',chr(i+48));
  76.     if (i>9) and (i<20) then
  77.      Number:=Concat('1',chr(i+38));
  78.     if (i>19) and (i<30) then
  79.      Number:=Concat('2',chr(i+28));
  80.     if i=30 then Number:='30';
  81.     NumIText:=IntuiText(1,0,JAM2,0,0,nil,Number,nil);
  82.     PrintIText(MyWindow^.RPort,^NumIText,310,11*j+3);
  83.    end;
  84.  end;
  85.  
  86.  
  87. procedure PrintNR(NRSide:integer);
  88.   var NRIText : IntuiText;
  89.  begin
  90.   NRIText:=IntuiText(1,0,JAM2,0,0,nil,NRText[NR[NRSide]],nil);
  91.   PrintIText(MyWindow^.RPort,^NRIText,340*(NRSide-1)+62,211);
  92.  end;
  93.  
  94.  
  95. procedure PrintSource(SourceSide:integer);
  96.   var SourceIText : IntuiText;
  97.  begin
  98.   SourceIText:=IntuiText(1,0,JAM2,0,0,nil,SourceText[Source[SourceSide]],nil);
  99.   PrintIText(MyWindow^.RPort,^SourceIText,340*(SourceSide-1)+217,211);
  100.  end;
  101.  
  102.  
  103. procedure PrintLength;
  104.   var LengthIText : IntuiText;
  105.  begin
  106.   LengthIText:=IntuiText(1,0,JAM2,0,0,nil,LengthText[Length],nil);
  107.   PrintIText(MyWindow^.RPort,^LengthIText,164,242);
  108.  end;
  109.  
  110.  
  111. procedure PrintPos;
  112.   var PosIText : IntuiText;
  113.  begin
  114.   PosIText:=IntuiText(1,0,JAM2,0,0,nil,PosText[Pos],nil);
  115.   PrintIText(MyWindow^.RPort,^PosIText,333,242);
  116.  end;
  117.  
  118.  
  119. { Define tape sorts, lengths, noise reductions etc. Adjust them according to
  120.   your special needs. }
  121. procedure DoVariables;
  122.  begin
  123.   NR[1]:=4; NR[2]:=4;
  124.   NRText[1]:='None    '; NRText[2]:='Dolby B '; NRText[3]:='Db B MPX';
  125.   NRText[4]:='Dolby C '; NRText[5]:='Db C MPX';
  126.   Source[1]:=1; Source[2]:=1;
  127.   SourceText[1]:='CD      '; SourceText[2]:='Phono   ';
  128.   SourceText[3]:='Tuner   '; SourceText[4]:='DAT     ';
  129.   SourceText[5]:='Tape    '; SourceText[6]:='Video   ';
  130.   SourceText[7]:='TV      '; SourceText[8]:='Computer';
  131.   SourceText[9]:='        ';
  132.   Length:=4;
  133.   LengthText[1]:='30 '; LengthText[2]:='45 '; LengthText[3]:='60 ';
  134.   LengthText[4]:='90 '; LengthText[5]:='120';
  135.   Pos:=2;
  136.   PosText[1]:='Normal'; PosText[2]:='Chrome'; PosText[3]:='Metal ';
  137.   Side:=0;
  138.  end;
  139.  
  140.  
  141. { Open Screen and Window. OK, OK, I know, this should be done more carefully,
  142.   but this is the way described in the handbook. I guess, that Open_Screen and
  143.   Open_Window, which are special Kick-Pascal functions, check if they return a
  144.   screen or a window. For this reason I don't check it again.}
  145. procedure DoScreen;
  146.  begin
  147.   MyScreen:=Open_Screen(0,0,640,256,2,0,1,HIRES,'Cassette Cover Printer V1.1');
  148.   MyWindow:=Open_Window(0,0,640,256,1,GADGETUP+GADGETDOWN+MENUPICK+_CLOSEWINDOW,WINDOWDEPTH+WINDOWCLOSE+ACTIVATE,'Cassette Cover Printer V1.1',MyScreen,320,640,320,640);
  149.  end;
  150.  
  151.  
  152. { Define the pull-down-menus. }
  153. procedure DoMenu;
  154.  begin
  155.   ProjMen:=Menu(^PrinMen,10,0,90,10,MENUENABLED,'Project',^Load,0,0,0,0);
  156.    Load:=MenuItem(^Save,0,0,90,10,ITEMTEXT+ITEMENABLED+HIGHCOMP+COMMSEQ,0,^LoadIText,nil,'O',nil,0);
  157.    LoadIText:=IntuiText(0,1,JAM2,1,1,nil,'Open',nil);
  158.    Save:=MenuItem(^Clear,0,10,90,10,ITEMTEXT+ITEMENABLED+HIGHCOMP+COMMSEQ,0,^SaveIText,nil,'S',nil,0);
  159.    SaveIText:=IntuiText(0,1,JAM2,1,1,nil,'Save',nil);
  160.    Clear:=MenuItem(^About,0,20,90,10,ITEMTEXT+ITEMENABLED+HIGHCOMP+COMMSEQ,0,^ClearIText,nil,'C',nil,0);
  161.    ClearIText:=IntuiText(0,1,JAM2,1,1,nil,'Clear',nil);
  162.    About:=MenuItem(^Quit,0,30,90,10,ITEMTEXT+ITEMENABLED+HIGHCOMP,0,^AboutIText,nil,chr(0),nil,0);
  163.    AboutIText:=IntuiText(0,1,JAM2,1,1,nil,'About',nil);
  164.    Quit:=MenuItem(nil,0,40,90,10,ITEMTEXT+ITEMENABLED+HIGHCOMP,0,^QuitIText,nil,chr(0),nil,0);
  165.    QuitIText:=IntuiText(0,1,JAM2,1,1,nil,'Quit',nil);
  166.  
  167.   PrinMen:=Menu(nil,120,0,90,10,MENUENABLED,'Print',^ASCII,0,0,0,0);
  168.    ASCII:=MenuItem(^LaTeX,0,0,90,10,ITEMTEXT+ITEMENABLED+HIGHNONE,0,^ASCIIIText,nil,chr(0),^ToPrinter,0);
  169.    ASCIIIText:=IntuiText(0,1,JAM2,1,1,nil,'ASCII',nil);
  170.     ToPrinter:=MenuItem(^ToFile,90,0,130,10,ITEMTEXT+ITEMENABLED+HIGHCOMP+COMMSEQ,0,^ToPrinterIText,nil,'P',nil,0);
  171.     ToPrinterIText:=IntuiText(0,1,JAM2,1,1,nil,'to Printer',nil);
  172.     ToFile:=MenuItem(nil,90,10,130,10,ITEMTEXT+ITEMENABLED+HIGHCOMP+COMMSEQ,0,^ToFileIText,nil,'F',nil,0);
  173.     ToFileIText:=IntuiText(0,1,JAM2,1,1,nil,'to File',nil);
  174.    LaTeX:=MenuItem(nil,0,10,90,10,ITEMTEXT+ITEMENABLED+HIGHCOMP+COMMSEQ,0,^LaTeXIText,nil,'L',nil,0);
  175.    LaTeXIText:=IntuiText(0,1,JAM2,1,1,nil,'LaTeX',nil);
  176.  
  177.   SetMenuStrip(MyWindow,^ProjMen);
  178.  end;
  179.  
  180.  
  181. { And define all the gadgets. }
  182. procedure DoGadgets;
  183.   var i : integer;
  184.  begin
  185.   TextBord:=Border(0,0,1,0,JAM1,5,^TextBordXY,nil);
  186.   TextBordXY:=IntArr10(-3,-2,258,-2,258,9,-3,9,-3,-2);
  187.   for i:=1 to 15 do
  188.    begin
  189.     SongGad[i]:=Gadget(nil,22,11*i+3,255,8,GADGHCOMP,GADGIMMEDIATE+RELVERIFY,STRGADGET,^TextBord,nil,nil,0,^SongTexInfo[i],i,0);
  190.     SongTexInfo[i]:=StringInfo(^SongTex[i],^UndoSongTex[i],0,32,0,0,0,0,0,0,nil,0,nil);
  191.     SongTex[i]:=''; UndoSongTex[i]:=''; OtherSideTex[i]:='';
  192.     AddGadget(MyWindow,^SongGad[i],nil);
  193.     SongGad[i+15]:=Gadget(nil,362,11*i+3,255,8,GADGHCOMP,GADGIMMEDIATE+RELVERIFY,STRGADGET,^TextBord,nil,nil,0,^SongTexInfo[i+15],i+15,0);
  194.     SongTexInfo[i+15]:=StringInfo(^SongTex[i+15],^UndoSongTex[i+15],0,32,0,0,0,0,0,0,nil,0,nil);
  195.     SongTex[i+15]:=''; UndoSongTex[i+15]:=''; OtherSideTex[i+15]:='';
  196.     AddGadget(MyWindow,^SongGad[i+15],nil);
  197.    end;
  198.  
  199.   for i:=1 to 2 do
  200.    begin
  201.     TitleGad[i]:=Gadget(nil,22,11*i+173,255,8,GADGHCOMP,GADGIMMEDIATE+RELVERIFY,STRGADGET,^TextBord,nil,nil,0,^TitleTexInfo[i],i+30,0);
  202.     TitleTexInfo[i]:=StringInfo(^TitleTex[i],UndoTitleTex[i],0,32,0,0,0,0,0,0,nil,0,nil);
  203.     TitleTex[i]:=''; UndoTitleTex[i]:='';
  204.     AddGadget(MyWindow,^TitleGad[i],nil);
  205.     TitleGad[i+2]:=Gadget(nil,362,11*i+173,255,8,GADGHCOMP,GADGIMMEDIATE+RELVERIFY,STRGADGET,^TextBord,nil,nil,0,^TitleTexInfo[i+2],i+32,0);
  206.     TitleTexInfo[i+2]:=StringInfo(^TitleTex[i+2],UndoTitleTex[i+2],0,32,0,0,0,0,0,0,nil,0,nil);
  207.     TitleTex[i+2]:=''; UndoTitleTex[i+2]:='';
  208.     AddGadget(MyWindow,^TitleGad[i+2],nil);
  209.    end;
  210.  
  211.   NRBord:=Border(0,0,1,0,JAM1,5,^NRBordXY,nil);
  212.   NRBordXY:=IntArr10(-4,-2,23,-2,23,9,-4,9,-4,-2);
  213.   NRGadText:=IntuiText(1,0,JAM1,2,0,nil,'NR',nil);
  214.   for i:=1 to 2 do
  215.    begin
  216.     NRGad[i]:=Gadget(nil,340*(i-1)+23,211,20,8,GADGHBOX,RELVERIFY,BOOLGADGET,^NRBord,nil,^NRGadText,0,nil,34+i,0);
  217.     AddGadget(MyWindow,^NRGad[i],nil);
  218.     PrintNR(i);
  219.    end;
  220.  
  221.   SourceBord:=Border(0,0,1,0,JAM1,5,^SourceBordXY,nil);
  222.   SourceBordXY:=IntArr10(-4,-2,53,-2,53,9,-4,9,-4,-2);
  223.   SourceGadText:=IntuiText(1,0,JAM1,1,0,nil,'Source',nil);
  224.   for i:=1 to 2 do
  225.    begin
  226.     SourceGad[i]:=Gadget(nil,340*(i-1)+148,211,50,8,GADGHBOX,RELVERIFY,BOOLGADGET,^SourceBord,nil,^SourceGadText,0,nil,36+i,0);
  227.     AddGadget(MyWindow,^SourceGad[i],nil);
  228.     PrintSource(i);
  229.    end;
  230.  
  231.   DateBord:=Border(0,0,1,0,JAM1,5,^DateBordXY,nil);
  232.   DateBordXY:=IntArr10(-3,-2,90,-2,90,9,-3,9,-3,-2);
  233.   DateIText:=IntuiText(1,0,JAM1,0,0,nil,'Date',nil);
  234.   for i:=1 to 2 do
  235.    begin
  236.     DateGad[i]:=Gadget(nil,340*(i-1)+69,227,87,8,GADGHCOMP,GADGIMMEDIATE,STRGADGET,^DateBord,nil,nil,0,^DateTexInfo[i],38+i,0);
  237.     DateTexInfo[i]:=StringInfo(^DateTex[i],^UndoDateTex[i],0,11,0,0,0,0,0,0,nil,0,nil);
  238.     DateTex[i]:=''; UndoDateTex[i]:='';
  239.     AddGadget(MyWindow,^DateGad[i],nil);
  240.     PrintIText(MyWindow^.RPort,^DateIText,340*(i-1)+20,227);
  241.    end;
  242.  
  243.   LengthBord:=Border(0,0,1,0,JAM1,5,^LengthBordXY,nil);
  244.   LengthBordXY:=IntArr10(-4,-2,21,-2,21,9,-4,9,-4,-2);
  245.   LengthGadText:=IntuiText(1,0,JAM1,5,0,nil,'C',nil);
  246.   LengthGad:=Gadget(nil,128,242,18,8,GADGHBOX,RELVERIFY,BOOLGADGET,^LengthBord,nil,^LengthGadText,0,nil,41,0);
  247.   AddGadget(MyWindow,^LengthGad,nil);
  248.   PrintLength;
  249.  
  250.   PosBord:=Border(0,0,1,0,JAM1,5,^PosBordXY,nil);
  251.   PosBordXY:=IntArr10(-4,-2,70,-2,70,9,-4,9,-4,-2);
  252.   PosGadText:=IntuiText(1,0,JAM1,2,0,nil,'Position',nil);
  253.   PosGad:=Gadget(nil,247,242,67,8,GADGHBOX,RELVERIFY,BOOLGADGET,^PosBord,nil,^PosGadText,0,nil,42,0);
  254.   AddGadget(MyWindow,^PosGad,nil);
  255.   PrintPos;
  256.  
  257.   SwitchBord:=Border(0,0,1,0,JAM1,5,^SwitchBordXY,nil);
  258.   SwitchBordXY:=IntArr10(-4,-2,101,-2,101,9,-4,9,-4,-2);
  259.   SwitchGadText:=IntuiText(1,0,JAM1,1,0,nil,'Switch Sides',nil);
  260.   SwitchGad:=Gadget(nil,430,242,98,8,GADGHBOX,RELVERIFY,BOOLGADGET,^SwitchBord,nil,^SwitchGadText,0,nil,43,0);
  261.   AddGadget(MyWindow,^SwitchGad,nil);
  262.  
  263.   PrintNumbers;
  264.   RefreshGadgets(MyWindow^.FirstGadget,MyWindow,nil);
  265.  end;
  266.  
  267.  
  268. { Switch to next noise redurction, source, etc. }
  269. procedure NextNR(NRSide:integer);
  270.  begin
  271.   if NR[NRSide]=5 then
  272.    NR[NRSide]:=1
  273.   else
  274.    NR[NRSide]:=Succ(NR[NRSide]);
  275.   PrintNR(NRSide);
  276.  end;
  277.  
  278.  
  279. procedure NextSource(SourceSide:integer);
  280.  begin
  281.   if Source[SourceSide]=9 then
  282.    Source[SourceSide]:=1
  283.   else
  284.    Source[SourceSide]:=Succ(Source[SourceSide]);
  285.   PrintSource(SourceSide);
  286.  end;
  287.  
  288.  
  289. procedure NextLength;
  290.  begin
  291.   if Length=5 then
  292.    Length:=1
  293.   else
  294.    Length:=Succ(Length);
  295.   PrintLength;
  296.  end;
  297.  
  298.  
  299. procedure NextPos;
  300.  begin
  301.   if Pos=3 then
  302.    Pos:=1
  303.   else
  304.    Pos:=Succ(Pos);
  305.   PrintPos;
  306.  end;
  307.  
  308.  
  309. procedure SwitchSides;
  310.   var i     : integer;
  311.       dummy : String[32];
  312.  begin
  313.   for i:=1 to 30 do
  314.    begin
  315.     dummy:=SongTex[i];
  316.     SongTex[i]:=OtherSideTex[i];
  317.     OtherSideTex[i]:=dummy;
  318.    end;
  319.   RefreshGadgets(MyWindow^.FirstGadget,MyWindow,nil);
  320.   if Side=0 then
  321.    Side:=1
  322.   else
  323.    Side:=0;
  324.   PrintNumbers;
  325.  end;
  326.  
  327.  
  328. { Load data-file. }
  329. procedure LoadData;
  330.   var i                           : integer;
  331.       filename,fileID             : string;
  332.       BodyIText,PosIText,NegIText : IntuiText;
  333.       loadfile,answer             : boolean;
  334.  begin
  335.   loadfile:=false;
  336.   while not loadfile do
  337.    begin
  338.     filename:=FileReq(MyWindow,'Load Data');
  339.     if filename='' then exit;
  340.     Reset(Output,filename);
  341.     readln(Output,fileID);
  342.     if fileID=fileIDstandard then loadfile:=true else
  343.      begin
  344.       BodyIText:=IntuiText(0,1,JAM2,30,5,nil,'This is no Data-File',nil);
  345.       PosIText:=IntuiText(0,1,JAM2,6,3,nil,'Retry',nil);
  346.       NegIText:=IntuiText(0,1,JAM2,6,3,nil,'Cancel',nil);
  347.       answer:=AutoRequest(MyWindow,^BodyIText,^PosIText,^NegIText,RELVERIFY,RELVERIFY,250,60);
  348.       if answer=false then exit;
  349.      end;
  350.    end;
  351.    if side=1 then SwitchSides;
  352.    for i:=1 to 4 do
  353.     readln(Output,TitleTex[i]);
  354.    for i:=1 to 15 do
  355.     readln(Output,SongTex[i]);
  356.    for i:=1 to 15 do
  357.     readln(Output,OtherSideTex[i]);
  358.    for i:=16 to 30 do
  359.     readln(Output,SongTex[i]);
  360.    for i:=16 to 30 do
  361.     readln(Output,OtherSideTex[i]);
  362.    for i:=1 to 2 do
  363.     begin
  364.      readln(Output,NR[i]);
  365.      readln(Output,Source[i]);
  366.      readln(Output,DateTex[i]);
  367.     end;
  368.    readln(Output,Length);
  369.    readln(Output,Pos);
  370.    Close(Output);
  371.    RefreshGadgets(MyWindow^.FirstGadget,MyWindow,nil);
  372.    for i:=1 to 2 do
  373.     begin
  374.      PrintNR(i);
  375.      PrintSource(i);
  376.     end;
  377.    PrintLength;
  378.    PrintPos;
  379.   end;
  380.  
  381.  
  382. { Save data-file. }
  383. procedure SaveData;
  384.   var i        : integer;
  385.       filename : string;
  386.  begin
  387.   filename:=FileReq(MyWindow,'Save Data');
  388.   if filename<>'' then
  389.    begin
  390.     if Side=1 then SwitchSides;
  391.     Rewrite(Output,filename);
  392.     writeln(Output,fileIDstandard);
  393.     for i:=1 to 4 do
  394.      writeln(Output,TitleTex[i]);
  395.     for i:=1 to 15 do
  396.      writeln(Output,SongTex[i]);
  397.     for i:=1 to 15 do
  398.      writeln(Output,OtherSideTex[i]);
  399.     for i:=16 to 30 do
  400.      writeln(Output,SongTex[i]);
  401.     for i:=16 to 30 do
  402.      writeln(Output,OtherSideTex[i]);
  403.     for i:=1 to 2 do
  404.      begin
  405.       writeln(Output,NR[i]);
  406.       writeln(Output,Source[i]);
  407.       writeln(Output,DateTex[i]);
  408.      end;
  409.     writeln(Output,Length);
  410.     writeln(Output,Pos);
  411.     Close(Output);
  412.     DisplayBeep(MyScreen);
  413.    end;
  414.  end;
  415.  
  416.  
  417. { Erase present contents of the gadgest. }
  418. procedure ClearData;
  419.   var i                           : integer;
  420.       BodyIText,PosIText,NegIText : IntuiText;
  421.       answer                      : boolean;
  422.  begin
  423.   BodyIText:=IntuiText(0,1,JAM2,7,5,nil,'Data will be lost! Continue?',nil);
  424.   PosIText:=IntuiText(0,1,JAM2,6,3,nil,'Yes, Please',nil);
  425.   NegIText:=IntuiText(0,1,JAM2,6,3,nil,'Oh, No!',nil);
  426.   answer:=AutoRequest(MyWindow,^BodyIText,^PosIText,^NegIText,RELVERIFY,RELVERIFY,260,60);
  427.   if answer=false then exit;
  428.   for i:=1 to 30 do
  429.    begin
  430.     SongTex[i]:=''; UndoSongTex[i]:='';
  431.     OtherSideTex[i]:='';
  432.    end;
  433.   for i:=1 to 4 do
  434.    begin
  435.     TitleTex[i]:=''; UndoTitleTex[i]:='';
  436.    end;
  437.   DateTex[1]:=''; UndoDateTex[1]:='';
  438.   DateTex[2]:=''; UndoDateTex[2]:='';
  439.   DoVariables;
  440.   RefreshGList(MyWindow^.FirstGadget,MyWindow,nil,-1);
  441.   PrintNumbers;
  442.   PrintNR(1); PrintNR(2);
  443.   PrintSource(1); PrintSource(2);
  444.   PrintLength;
  445.   PrintPos;
  446.  end;
  447.  
  448.  
  449. { Output line to whatever will receive it, either PRT: or a file. }
  450. procedure PrintLine(TexA,TexB:String;Middle:Char);
  451.   var PTexA,PTexB : string;
  452.  begin
  453.   PTexA:=TexA+Copy(spaces,1,31-StrLen(TexA));
  454.   PTexB:=TexB+Copy(spaces,1,31-StrLen(TexB));
  455.   writeln(Output,"| "+PTexA+" "+Middle+" "+PTexB+" |");
  456.  end;
  457.  
  458.  
  459. { Print the cover made out of ASCII-character. }
  460. procedure OutputCover(filename:string);
  461.   var i          : integer;
  462.       Middle     : char;
  463.       pron,proff : string;
  464.       ExtPrint   : boolean;
  465.  begin
  466.   pron:=chr(27)+"[4w"+chr(27)+"[2"+chr(34)+"z"+chr(27)+"(B";
  467.   proff:=chr(27)+"[0w"+chr(27)+"[1"+chr(34)+"z";
  468.   if Side=1 then SwitchSides;
  469.   ExtPrint:=false;
  470.   for i:=1 to 30 do
  471.    if OtherSideTex[i]<>'' then ExtPrint:=True;
  472.   ReWrite(Output,filename);
  473.   write(Output,pron);
  474.   writeln(Output,line);
  475.   if ExtPrint then
  476.    begin
  477.     for i:=1 to 15 do
  478.       PrintLine(OtherSideTex[i],OtherSideTex[i+15],"|");
  479.     writeln(Output,line);
  480.    end;
  481.   Middle:="|"
  482.   for i:=1 to 15 do
  483.    begin
  484.     if ExtPrint and (i=15) then Middle:="V";
  485.     PrintLine(SongTex[i],SongTex[i+15],Middle);
  486.    end;
  487.   writeln(Output,line);
  488.   PrintLine(TitleTex[1],TitleTex[2]," ");
  489.   PrintLine(TitleTex[3],TitleTex[4]," ");
  490.   writeln(Output,line);
  491.   PrintLine("NR: "+NRText[NR[1]]+"   Source: "+SourceText[Source[1]],"NR: "+NRText[NR[2]]+"   Source: "+SourceText[Source[2]],"|");
  492.   PrintLine("Date: "+DateTex[1],"Date: "+DateTex[2],"|");
  493.   writeln(Output,"|"+Copy(spaces,1,15)+"C"+LengthText[Length]+Copy(spaces,1,24)+"Position: "+PosText[Pos]+Copy(spaces,1,8)+"|");
  494.   writeln(Output,line);
  495.   writeln(Output,proff);
  496.   Close(Output);
  497.   DisplayBeep(MyScreen);
  498.  end;
  499.  
  500.  
  501. { Send cover to printer. }
  502. procedure PrintCover;
  503.  begin
  504.   OutputCover('prt:');
  505.  end;
  506.  
  507.  
  508. { Send cover to file. }
  509. procedure SaveCover;
  510.   var filename:string;
  511.  begin
  512.   filename:=FileReq(MyWindow,'Save Cover');
  513.   if filename<>'' then OutputCover(filename);
  514.  end;
  515.  
  516.  
  517. { Produce LaTeX-file. }
  518. procedure SaveLaTeX;
  519.   var i        : integer;
  520.       filename : string;
  521.       ExtPrint : boolean;
  522.  begin
  523.   filename:=FileReq(MyWindow,'Save LaTeX Source File');
  524.   if filename<>'' then
  525.    begin
  526.     ExtPrint:=false;
  527.     if Side=1 then SwitchSides;
  528.     for i:=1 to 30 do
  529.      if OtherSideTex[i]<>'' then ExtPrint:=True;
  530.     Rewrite(Output,filename);
  531.     writeln(Output,'\documentstyle{article}');
  532.     writeln(Output,'\begin{document}');
  533.     writeln(Output,'\pagestyle{empty}');
  534.     writeln(Output,'\unitlength1mm');
  535.     writeln(Output);
  536.     if ExtPrint then
  537.      begin
  538.       writeln(Output,'\begin{picture}(102,161)(0,0)');
  539.       writeln(Output,' \put(0,0){\framebox(102,161){}}');
  540.       writeln(Output,' \put(51,29){\line(0,1){132}}');
  541.       writeln(Output,' \put(0,95){\line(1,0){102}}');
  542.      end
  543.     else
  544.      begin
  545.       writeln(Output,'\begin{picture}(102,95)(0,0)');
  546.       writeln(Output,' \put(0,0){\framebox(102,95){}}');
  547.       writeln(Output,' \put(51,29){\line(0,1){66}}');
  548.      end;
  549.     writeln(Output,' \put(0,16){\framebox(102,13){}}');
  550.     writeln(Output,' \put(0,6){\line(1,0){102}}');
  551.     writeln(Output,' \put(51,6){\line(0,1){10}}');
  552.     writeln(Output);
  553.     writeln(Output,' \put(0,1){\makebox(51,5){C'+LengthText[Length]+'}}');
  554.     writeln(Output,' \put(51,1){\makebox(51,5){Position: '+PosText[Pos]+'}}');
  555.     writeln(Output,' \put(1,6){\makebox(24,5)[l]{Date: '+DateTex[1]+'}}');
  556.     writeln(Output,' \put(52,6){\makebox(24,5)[l]{Date: '+DateTex[2]+'}}');
  557.     writeln(Output,' \put(1,11){\makebox(21,5)[l]{NR: '+NRText[NR[1]]+'}}');
  558.     writeln(Output,' \put(52,11){\makebox(21,5)[l]{NR: '+NRText[NR[2]]+'}}');
  559.     writeln(Output,' \put(26,8.5){\makebox(24,5)[r]{Src: '+SourceText[Source[1]]+'}}');
  560.     writeln(Output,' \put(77,8.5){\makebox(24,5)[r]{Src: '+SourceText[Source[2]]+'}}');
  561.     writeln(Output);
  562.     writeln(Output,' \put(1,22.5){\makebox(49,5.5)[l]{\large '+TitleTex[1]+'}}');
  563.     writeln(Output,' \put(52,22.5){\makebox(49,5.5)[l]{\large '+TitleTex[2]+'}}');
  564.     writeln(Output,' \put(1,17){\makebox(49,5.5)[l]{\large '+TitleTex[3]+'}}');
  565.     writeln(Output,' \put(52,17){\makebox(49,5.5)[l]{\large '+TitleTex[4]+'}}');
  566.     writeln(Output);
  567.     if ExtPrint then
  568.      begin
  569.       for i:=1 to 15 do
  570.        writeln(Output,' \put(1,',160.7-i*4.4,'){\makebox(49,4.1)[tl]{'+OtherSideTex[i]+'}}');
  571.       writeln(Output);
  572.       for i:=1 to 15 do
  573.        writeln(Output,' \put(52,',160.7-i*4.4,'){\makebox(49,4.1)[tl]{'+OtherSideTex[i+15]+'}}');
  574.      end;
  575.     for i:=1 to 15 do
  576.      writeln(Output,' \put(1,',94.7-i*4.4,'){\makebox(49,4.1)[tl]{'+SongTex[i]+'}}');
  577.     writeln(Output);
  578.     for i:=1 to 15 do
  579.      writeln(Output,' \put(52,',94.7-i*4.4,'){\makebox(49,4.1)[tl]{'+SongTex[i+15]+'}}');
  580.     writeln(Output);
  581.     writeln(Output,'\end{picture}');
  582.     writeln(Output);
  583.     writeln(Output,'\end{document}');
  584.     Close(Output);
  585.     DisplayBeep(MyScreen);
  586.    end;
  587.  end;
  588.  
  589.  
  590. { Ahem, well, in case anybody is interested... }
  591. procedure Copyright;
  592.   var CopyWindow:^Window;
  593.       CopyMsg:^IntuiMessage;
  594.       line1,line2,line3:IntuiText;
  595.  begin
  596.   CopyWindow:=Open_Window(150,48,340,120,1,MOUSEBUTTONS,ACTIVATE,nil,MyScreen,300,160,300,160);
  597.   line1:=IntuiText(1,0,JAM2,0,0,nil,'Cassette Cover Printer V1.1',^line2);
  598.   line2:=IntuiText(1,0,JAM2,24,28,nil,'©1991 by Jörn Clausen',^line3);
  599.   line3:=IntuiText(1,0,JAM2,44,56,nil,'This is Freeware',nil);
  600.   PrintIText(CopyWindow^.RPort,^line1,62,28);
  601.   while CopyMsg^.Class<>MOUSEBUTTONS do
  602.    begin
  603.     CopyMsg:=Wait_Port(CopyWindow^.UserPort);
  604.     CopyMsg:=Get_Msg(CopyWindow^.UserPort);
  605.    end;
  606.   Close_Window(CopyWindow);
  607.  end;
  608.  
  609.  
  610. { Hope you have enjoyed the program. }
  611. procedure QuitProg;
  612.   var BodyIText,PosIText,NegIText : IntuiText;
  613.       answer                      : boolean;
  614.  begin
  615.   BodyIText:=IntuiText(0,1,JAM2,72,5,nil,'Really Quit?',nil);
  616.   PosIText:=IntuiText(0,1,JAM2,6,3,nil,'Yes, Please',nil);
  617.   NegIText:=IntuiText(0,1,JAM2,6,3,nil,'Oh, No!',nil);
  618.   answer:=AutoRequest(MyWindow,^BodyIText,^PosIText,^NegIText,RELVERIFY,RELVERIFY,260,60);
  619.   if answer=true then running:=false;
  620.  end;
  621.  
  622.  
  623. { And clean up the mess (although Kick-Pascal promisses to do all this on its
  624.   own, I prefer to close the things I used on my own). }
  625. procedure CloseAll;
  626.   var dummy : ptr;
  627.  begin
  628.   dummy:=RemoveGList(MyWindow,MyWindow^.FirstGadget,-1);
  629.   ClearMenuStrip(MyWindow);
  630.   Close_Window(MyWindow);
  631.   Close_Screen(MyScreen);
  632.  end;
  633.  
  634.  
  635. { Finally made it to the main loop? Keep on reading. }
  636. begin
  637.  DoVariables;
  638.  DoScreen;
  639.  DoMenu;
  640.  DoGadgets;
  641.  running:=true;
  642.  while running=true do
  643.   begin
  644.    Msg:=Wait_Port(MyWindow^.UserPort);
  645.    Msg:=Get_Msg(MyWindow^.UserPort);
  646.    case Msg^.Class of
  647.     _CLOSEWINDOW : QuitProg;
  648.     GADGETUP     : begin
  649.                     ClickGad:=Msg^.IAddress;
  650.                     case ClickGad^.GadgetID of
  651.                      1..14,16..29 : success:=ActivateGadget(^SongGad[ClickGad^.GadgetID+1],MyWindow,nil);
  652.                             31,33 : success:=ActivateGadget(^TitleGad[ClickGad^.GadgetID-29],MyWindow,nil);
  653.                                35 : NextNR(1);
  654.                                36 : NextNR(2);
  655.                                37 : NextSource(1);
  656.                                38 : NextSource(2);
  657.                                41 : NextLength;
  658.                                42 : NextPos;
  659.                                43 : SwitchSides;
  660.                      OTHERWISE;
  661.                     end;
  662.                    end;
  663.     MENUPICK     : begin
  664.                     Picked:=Msg^.Code;
  665.                     PMenu:=Picked and $1f;
  666.                     PMenuItem:=(Picked and $7e0) div 32;
  667.                     PMenuSubItem:=(Picked and $f800) div 2048;
  668.                     case PMenu of
  669.                      0 : case PMenuItem of
  670.                           0 : LoadData;
  671.                           1 : SaveData;
  672.                           2 : ClearData;
  673.                           3 : Copyright;
  674.                           4 : QuitProg;
  675.                          end;
  676.                      1 : case PMenuItem of
  677.                           0 : If PMenuSubItem=0 then
  678.                                PrintCover
  679.                               else
  680.                                SaveCover;
  681.                           1 : SaveLaTeX;
  682.                          end;
  683.                      OTHERWISE;
  684.                     end;
  685.                    end;
  686.     OTHERWISE;
  687.    end;
  688.   end;
  689.  CloseAll;
  690. end.
  691.  
  692.